
.section .text
.globl _start
.extern testDisk
.extern _ZN16interruptmanager17DoInterruptHandleEyy
_start:

	mov	$0x10,	%ax
	mov	%ax,	%ds
	mov	%ax,	%es
	mov	%ax,	%fs
	mov	%ax,	%ss
	mov	$0x7E00,	%esp

	

//=======	load GDTR

	lgdt	GDT_POINTER(%rip)

//=======	load	IDTR

	lidt	IDT_POINTER(%rip)
	
	mov	$0x10,	%ax
	mov	%ax,	%ds
	mov	%ax,	%es
	mov	%ax,	%fs
	mov	%ax,	%gs
	mov	%ax,	%ss

	movq	_stack_start(%rip),	%rsp

//=======	load	cr3

	



	movq	$0x101000,	%rax
	movq	%rax,		%cr3

	movq	switch_seg(%rip),	%rax
	pushq	$0x08
	pushq	%rax
	lretq

//=======	64-bit mode code

switch_seg:
	.quad	entry64

entry64:



	movq	$0x10,	%rax
	movq	%rax,	%ds
	movq	%rax,	%es
	movq	%rax,	%gs
	movq	%rax,	%ss
	movq	_stack_start(%rip),	%rsp		/* rsp address */
	movq 	$0x1b,	%rcx    #if APU
	rdmsr
	bt	$8,	%rax
	jnc start_smp

/*
setup_IDT:							
	leaq	ignore_int(%rip),	%rdx   #获取函数偏移
	movq	$(0x08 << 16),	%rax   #rax = 8 << 16    00000000 0008 0000
	movw	%dx,	%ax    #   ax = address & 0xFFFF#  00000000 0000  0008 address低2字节
	movq	$(0x8E00 << 32),	%rcx		#rcx = 0000 8E00 0000 0000
	addq	%rcx,	%rax                          #0000 8E00 0000 0008 address低2字节
	movl	%edx,	%ecx
	shrl	$16,	%ecx
	shlq	$48,	%rcx
	addq	%rcx,	%rax                          #address的3,4字节 8E00 0000  0008 address低2字节
	shrq	$32,	%rdx
	leaq	IDT_Table(%rip),	%rdi  #rDX = address的高 4字节
	mov	$256,	%rcx
rp_sidt:
	movq	%rax,	(%rdi)
	movq	%rdx,	8(%rdi)
	addq	$0x10,	%rdi
	dec	%rcx
	jne	rp_sidt  #循环设置256个表项  
*/


/*setup_TSS64:
	leaq	TSS64_Table(%rip),	%rdx
	xorq	%rax,	%rax
	xorq	%rcx,	%rcx
	movq	$0x89,	%rax
	shlq	$40,	%rax  #0000 8900 0000 0000
	movl	%edx,	%ecx  
	shrl	$24,	%ecx
	shlq	$56,	%rcx 
	addq	%rcx,	%rax#高1字节00 89 0000 0000 0000
	xorq	%rcx,	%rcx
	movl	%edx,	%ecx
	andl	$0xffffff,	%ecx#
	shlq	$16,	%rcx #
	addq	%rcx,	%rax#高1字节00 8900 00 低3字节 0000 
	addq	$103,	%rax#高1字节00 8900 00 低3字节 0103
	leaq	GDT_Table(%rip),	%rdi
	movq	%rax,	64(%rdi) #0x40     TS占128位
	shrq	$32,	%rdx
	movq	%rdx,	72(%rdi) #0x48

	//mov	$0x40,	%ax
	//ltr	%ax
*/




	movq	go_to_kernel(%rip),	%rax		/* movq address */
	
	pushq	$0x08
	pushq	%rax

	lretq








start_smp:
	movq $0xffff800000007E00,%rsp
	movq go_to_smp_kernel(%rip), %rax
	pushq $0x08
	pushq %rax
	lretq

go_to_kernel:
	.quad	Start_Kernel

go_to_smp_kernel:
	.quad Start_Smp




//=======	init page
.align 8

.org	0x1000

__PML4E:

	.quad	0x102007
	.fill	255,8,0
	.quad	0x102007
	.fill	255,8,0

.org	0x2000

__PDPTE:
	
	.quad	0x103007
	.fill	511,8,0

.org	0x3000

__PDE:

	.quad	0x000087	
	.quad	0x200087
	.quad	0x400087
	.quad	0x600087
	.quad	0x800087		/* 0x800083 */
	.quad	0xa00087
	.quad	0xc00087
	.quad	0xe00087
	.quad	0x1000087
	.quad	0x1200087
	.quad	0x1400087
	.quad	0x1600087
	.quad	0x1800087
	.quad	0x1a00087
	.quad	0x1c00087
	.quad	0x1e00087
	.quad	0x2000087
	.quad	0x2200087
	.quad	0x2400087
	.quad	0x2600087
	.quad	0x2800087
	.quad	0x2a00087
	.quad	0x2c00087
	.quad	0x2e00087

	// .quad	0xfd000087	/*0x 3000000*/
	// .quad	0xfd200087	/*0x 3000000*/
	// .quad	0xfd400087	/*0x 3000000*/
	// .quad	0xfd600087	/*0x 3000000*/
	// .quad	0xfd800087	/*0x 3000000*/
	// .quad	0xfdA00087	/*0x 3000000*/
	// .quad	0xfdC00087	/*0x 3000000*/
	// .quad	0xfdE00087	/*0x 3000000*/

	.quad	0xe0000087		
	.quad	0xe0200087
	.quad	0xe0400087
	.quad	0xe0600087
	.quad	0xe0800087
	.quad	0xe0a00087
	.quad	0xe0c00087
	.quad	0xe0e00087
	.fill	480,8,0

//=======	GDT_Table

.section .data

.globl GDT_Table

GDT_Table:
	.quad	0x0000000000000000			/*0	NULL descriptor		       	00*/
	.quad	0x0020980000000000			/*1	KERNEL	Code	64-bit	Segment	08*/
	.quad	0x0000920000000000			/*2	KERNEL	Data	64-bit	Segment	10*/
	.quad	0x0000000000000000			/*3	USER	Code	32-bit	Segment 18*/
	.quad	0x0000000000000000			/*4	USER	Data	32-bit	Segment 20*/
	.quad	0x0020f80000000000			/*5	USER	Code	64-bit	Segment	28*/
	.quad	0x0000f20000000000			/*6	USER	Data	64-bit	Segment	30*/
	.quad	0x00cf9a000000ffff			/*7	KERNEL	Code	32-bit	Segment	38*/
	.quad	0x00cf92000000ffff			/*8	KERNEL	Data	32-bit	Segment	40*/
	.fill	100,8,0					/*10 ~ 11 TSS (jmp one segment <9>) in long-mode 128-bit 50*/
GDT_END:

GDT_POINTER:
GDT_LIMIT:	.word	GDT_END - GDT_Table - 1
GDT_BASE:	.quad	GDT_Table

//=======	IDT_Table

.globl IDT_Table

IDT_Table:
	.fill  512,8,0
IDT_END:

IDT_POINTER:
IDT_LIMIT:	.word	IDT_END - IDT_Table - 1
IDT_BASE:	.quad	IDT_Table

//=======	TSS64_Table

.globl	TSS64_Table

TSS64_Table:
	.fill  13,8,0
TSS64_END:

TSS64_POINTER:
TSS64_LIMIT:	.word	TSS64_END - TSS64_Table - 1
TSS64_BASE:	.quad	TSS64_Table

